package com.wfm.leetcode.editor.cn;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * 两种写法第一种：
 * 主函数不需要遍历，全部交给dfs函数处理
 * dfs函数一进来不需要操作数据，直接进入for选择空间做选择，在操作
 * 遇到合适的解可以return，因为回溯操作已经在for选择空间中回溯了
 * 总结：相当于处理操作和进入选择空间是合并的
 * 第二种：
 * 主函数里需要遍历选择谁开始
 * dfs函数需要一进来操作数据，操作主函数传进来的情况后，再进入for选择空间
 * 遇到合适的解，不能return，因为可能后续需要回溯
 * 总结：相当于处理操作和进入选择空间是分开的
 * 时间复杂度：O(n!)
 *
 */
public class PFour6全排列{
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {

    List<List<Integer>> res = new ArrayList<>();// 存放符合条件结果的集合
    LinkedList<Integer> path = new LinkedList<>();// 用来存放符合条件结果
    boolean[] visited;
    public List<List<Integer>> permute(int[] nums) {
        if (nums.length == 0){
            return res;
        }
        visited = new boolean[nums.length];
        permuteHelper(nums);
        return res;
    }

    private void permuteHelper(int[] nums){
        if (path.size() == nums.length){
            res.add(new ArrayList<>(path));
            return;
        }
        for (int i = 0; i < nums.length; i++){
            if (visited[i]){
                continue;
            }
            visited[i] = true;
            path.add(nums[i]);
            permuteHelper(nums);
            path.removeLast();
            visited[i] = false;
        }
    }

//    List<List<Integer>> res = new ArrayList<>();
//    List<Integer> path =new ArrayList<>();
//    boolean[] visited;
//    public List<List<Integer>> permute(int[] nums) {
//        visited = new boolean[nums.length];
//        for (int i = 0; i < nums.length; i++) {
//            dfs(nums,i);
//        }
//        return res;
//    }
//    void dfs(int[] nums,int i){
//        path.add(nums[i]);
//        visited[i]=true;
//        if(path.size()==nums.length){
//            res.add(new ArrayList<>(path));
//        }
//        for (int j = 0; j < nums.length; j++) {
//            if(!visited[j]){
//                dfs(nums,j);
//            }
//        }
//        path.remove(path.size()-1);
//        visited[i]=false;
//    }



}
//leetcode submit region end(Prohibit modification and deletion)

    public static void main(String[] args) { 
        Solution solution = new PFour6全排列().new Solution();
        List<List<Integer>> permute = solution.permute(new int[]{1, 2, 3});
        System.out.println(permute);
    }
}